01 别动,定 - taskset 与进程绑核
CPU 调度
- CPU 调度(CPU Scheduling)是操作系统内核的一个重要功能,负责决定哪个进程或线程在何时获得 CPU 资源。
- CPU 调度器的目标是最大化 CPU 利用率、最小化响应时间、确保公平性,并满足各种系统需求。Linux 内核提供了多种调度策略和算法,以适应不同的工作负载和性能需求。
- 在多任务操作系统中,多个进程可以同时运行,但 CPU 核心的数量有限,因此需要有效的调度算法来管理这些任务的执行顺序,确保系统资源得到合理的分配并保持系统的响应性。
- 调度依据:进程的优先级、进程的等待时间、进程需要的资源等;
taskset:人为设定进程运行的 CPU
进程与线程
- 进程:一个独立的执行环境,包括代码、数据、堆栈和资源。
- 线程:进程内的一个执行单元,共享进程的资源,但有自己的堆栈和寄存器状态。
CPU 调度与绑核
- 默认情况下,操作系统根据进程的优先级、进程的等待时间、进程需要的资源等信息,调度不同的进程在 CPU 上运行,尽可能保证各 CPU 之间负载均衡;
- 在某些应用场景(如程序性能优化等)中,就有必要考虑将其绑定到 CPU 或 CPU 组上运行,以减小由于在不同的核上调度造成的开销
taskset
taskset是 Linux 中用于设置或查看进程的 CPU 亲和性(CPU affinity)的一种工具。- 通过使用
taskset,我们可以将进程(或线程)绑定到特定的 CPU 核心上运行,避免进程在多个 CPU 核心之间频繁切换。这种操作可以帮助提高进程的性能,特别是在多核 CPU 的场景下。
CPU 亲和性 CPU Affinity
CPU 亲和性(CPU affinity)是指进程与 CPU 核心之间的绑定关系。通过设置 CPU 亲和性,可以确保进程在指定的 CPU 核心上运行,而不是在系统中的任意核心上运行。这种绑定可以用于以下几个目的:
- 提高缓存命中率:如果一个进程总是在同一个 CPU 核心上运行,那么它会更频繁地使用该核心的缓存,从而提高缓存命中率,减少内存访问延迟。
- 减少上下文切换(Context Switch):将进程绑定到特定的 CPU 核心上可以减少 CPU 核心之间的上下文切换,从而减少调度开销。
- 隔离进程:在多核系统中,可以将不同的进程绑定到不同的 CPU 核心上,以实现进程之间的隔离,避免相互干扰。
taskset 命令
taskset 是用于设置或查看进程的 CPU 亲和性的命令。它的基本用法包括:
- 设置 CPU 亲和性:将进程或命令绑定到某些 CPU 核心上。
- 查看 CPU 亲和性:查看某个进程目前可以在哪些 CPU 核心上运行。
taskset [options] [mask | CPU-list] [pid | command [arguments]]- mask | CPU-list:定义了将进程绑定到哪些 CPU 核心。可以用 CPU 掩码(mask)或 CPU 列表(list)形式来指定。
- pid:要查看或修改的进程 ID。
- command:要绑定 CPU 核心的命令。
参数解释
- CPU 掩码(mask):用十六进制数表示绑定的 CPU 核心。掩码中的每一位表示一个 CPU 核心,如果该位为
1,表示允许进程在该 CPU 上运行。例如:0x1:表示绑定到 CPU 0。0x3:表示绑定到 CPU 0 和 CPU 1(0011)。
- CPU 列表(list):直接用逗号分隔的 CPU 核心号表示,或者用
-表示连续的 CPU 核心范围。例如:0:表示绑定到 CPU 0。0,1,2:表示绑定到 CPU 0、1 和 2。0-3:表示绑定到 CPU 0、1、2 和 3。
CPU 亲和性掩码的表示方法
CPU 亲和性掩码可以用多种方式表示:
- 十六进制:例如
0x01表示只允许在 CPU0 上运行,0x03表示允许在 CPU0 和 CPU1 上运行。 - 二进制:例如
0001表示只允许在 CPU0 上运行,0011表示允许在 CPU0 和 CPU1 上运行。 - 十进制:例如
1表示只允许在 CPU0 上运行,3表示允许在 CPU0 和 CPU1 上运行。
常用示例
- 查看进程 CPU 亲和性:
taskset -p <pid>。 - 设置已有进程的 CPU 亲和性:
taskset -p <mask> <pid>。 - 启动新进程并设置 CPU 亲和性:
taskset <mask> <command>或taskset -c <CPU-list> <command>。
查看进程的 CPU 亲和性
taskset -p <pid> # 以二进制掩码形式查看 PID 的 CPU 亲和性(所允许调度运行的 CPU 核心)
taskset -cp <pid> # 以列表形式查看 PID 的 CPU 亲和性
➜ ~ taskset -p 1234 # 查看 PID 为 1234 的进程的 CPU 亲和性掩码
pid 1234's current affinity mask: 3 # 表明该进程可以在 CPU 0 和 CPU 1 上运行(`0x3`,即 `0011`,表示 CPU 0 和 1)
➜ ~ taskset -cp 1234 # 以列表形式查看 PID 为 1234 的进程的 CPU 亲和性
pid 1234's current affinity list: 0,1 # 表明该进程可以在 CPU 0 和 CPU 1 上运行绑定进程到指定的 CPU 核心
修改现有进程的 CPU 亲和性:可以通过 taskset 命令将某个运行中的进程绑定到特定的 CPU 核心。
taskset -p <mask> <pid>
➜ ~ taskset -p 0x1 1234 # 将 PID 为 1234 的进程绑定到 CPU 0 上
➜ ~ taskset -p 0x03 1234 # 把进程 ID 为 1234 的进程的 CPU 亲和性设置为允许在 CPU0 和 CPU1 上运行
➜ ~ taskset -cp 0,1 1235
# 使用 taskset 命令将 PID 为 1235 的进程绑定到 CPU 0 和 CPU 1
# -c 表示使用 CPU 核心列表方式,p 表示针对已有进程
# 0,1 表示将进程绑定到 CPU 0 和 CPU 1
# 1235 是目标进程的 PID
pid 1235's current affinity list: 0-3 # 当前 PID 为 1235 的进程可以在 CPU 0-3(即 4 个 CPU 核心)上运行
pid 1235's new affinity list: 0,1 # 新的亲和性设置为 CPU 0 和 CPU 1,现在该进程只能在这两个核心上运行
➜ ~ taskset -p 0x1 1235
# 使用 taskset 命令将 PID 为 1235 的进程绑定到 CPU 0 上运行
# -p 表示针对已有进程,0x1 是十六进制的 CPU 掩码,表示只允许进程在 CPU 0 上运行
# 0x1 的二进制为 0001,对应 CPU 0
# 1235 是目标进程的 PID
pid 1235's current affinity mask: f # 当前 PID 为 1235 的进程亲和性掩码为 f(十六进制),表示 CPU 0-3(四个核心)都可运行
# f 的二进制为 1111,表示 CPU 0, 1, 2 和 3 都启用
pid 1235's new affinity mask: 1 # 新的亲和性掩码为 1,表示进程现在只能在 CPU 0 上运行。
# 1 的二进制为 0001,表示只启用第 0 个 CPU 核心。直接绑定新进程到特定的 CPU 核心
启动一个新进程并绑定到指定 CPU 核心:除了对已有进程修改 CPU 亲和性,还可以在启动进程时直接指定它运行在哪些 CPU 上。
taskset <mask> <command> # 以二进制掩码形式设定 CPU 调度列表并启动进程
➜ ~ taskset 0x3 ./my_program # 运行 my_program 并绑定到 CPU 0 和 CPU 1
[1] 1234
➜ ~ taskset 0x1 bash process.sh & # 启动一个后台进程,并将其绑定到 CPU 0 上运行
[2] 1235
➜ ~ taskset 0x01 ./my_program # 启动 my_program 进程,并将其绑定到 CPU 0 上运行
➜ ~ taskset -c 0,1 ./my_program # 使用 CPU 列表的方式
➜ ~ taskset -p 1234 # 查看进程 1234 的 CPU 亲和性
pid 1234's current affinity mask: 3 # 表明该进程可以在 CPU 0 和 CPU 1 上运行解除 CPU 绑定
如果想让某个进程可以在所有 CPU 上运行,恢复默认调度,可以通过指定所有 CPU 掩码。
# 系统有 4 个 CPU 核心,将进程绑定回所有核心
➜ ~ taskset -p 0xf <pid> # 0xf 表示可以在所有 4 个 CPU 核心上运行(`1111`)进程绑核的实际应用
- 提高性能:在某些情况下,将进程绑定到特定的 CPU 核心上可以提高性能。例如,对于计算密集型任务,如果进程总是在同一个 CPU 核心上运行,那么它可以更有效地利用该核心的缓存,从而减少内存访问延迟。
- 隔离进程:在多核系统中,可以将不同的进程绑定到不同的 CPU 核心上,以实现进程之间的隔离。例如,可以将一个高优先级的进程绑定到一个特定的 CPU 核心上,以确保它不会受到其他低优先级进程的干扰。
- 负载均衡:在某些情况下,可以通过将进程绑定到特定的 CPU 核心上来实现负载均衡。例如,可以将多个进程分别绑定到不同的 CPU 核心上,以确保每个核心的负载相对均衡。
进程绑核的优缺点
优点:
- 减少上下文切换:进程在不同 CPU 核心之间频繁切换会导致 CPU 缓存失效,从而影响性能。绑定到固定 CPU 核心可以避免这种情况。
- 提高性能:在多核环境下,一些实时应用或高性能计算应用可能需要严格的 CPU 绑定来优化性能,减少调度开销。
缺点:
- 资源利用不均衡:如果系统中有多个进程被绑定到相同的 CPU 核心,可能导致某些核心负载过重,而其他核心闲置。
- 灵活性降低:默认情况下,内核调度程序会根据系统负载动态调整进程的运行位置。绑定 CPU 可能会减少系统的调度优化空间。
taskset 的主要应用场景
- 提高进程性能:避免进程在不同的 CPU 核心之间频繁切换以提高进程的性能;
- 避免进程抢占:避免进程抢占 CPU 资源,从而提高系统的整体性能;
- 限制进程 CPU 使用率:避免进程占用过多 CPU 资源导致其他进程性能下降;
- 调试进程:避免进程在不同的 CPU 核间频繁切换,从而更容易地观察进程的行为。
top 中查看进程 PID 的 CPU 位置
使用 top 命令查看某个进程的 CPU 位置(即哪个 CPU 核心正在执行该进程):可以通过启用 P 列(即处理器编号列)来实现。
打开
top命令:在
top命令界面中,按下键盘的f键,进入字段管理模式。使用方向键,选择
P = Last Used Cpu (SMP)(P 列显示每个进程当前运行在哪个 CPU 核心上,能够显示该命令最后使用的 CPU)。此时应该会有一个*星号标记在P = Last Used Cpu (SMP)前面。
按
Esc/q键,返回top的主界面。现在在
top命令界面中,你将看到每个进程对应的P列显示的是该进程当前运行在哪个 CPU 核心上。
TIP
taskset 显示的是所允许的 CPU 调度列表;top 显示的是上一个周期所在 CPU;
top命令top命令中的P列显示 当前时刻 某个进程正在使用的 CPU 核心编号。这是一个动态的、实时变化的值。由于现代操作系统和调度器(如 Linux 的 CFS 调度器)会不断地在多个 CPU 核心之间调度任务,某个进程可能频繁地从一个核心迁移到另一个核心,所以top看到的是 实时瞬间 的 CPU 使用情况。- 例如,某个进程可能此时运行在 CPU 核心 0 上,但在下一时刻被调度到 CPU 核心 2,
top显示的是当前它在哪个核心上。
taskset命令taskset命令则是用来查看或者设置进程的 CPU 亲和性(CPU Affinity),即允许该进程在哪些 CPU 核心上运行。它显示的不是进程此刻在哪个核心上运行,而是进程被限制可以运行在哪些核心上。- CPU 亲和性可以指定一个进程只能在特定的 CPU 核心上运行,限制其调度范围。通过
taskset,你可以看到一个进程当前被分配的 CPU 集合(可能是多个 CPU 核心)。 - 例如,
taskset -p 1234可能会显示某个进程可以在 CPU 0 和 CPU 1 上运行,而具体它此时在哪个 CPU 核心上运行要用top或其他工具来查看。
区别总结:
top显示的是进程 当前时刻 运行在哪个 CPU 核心上,这个核心号会动态变化。taskset显示的是进程的 CPU 亲和性,即允许该进程在哪些 CPU 核心上执行,这个范围通常是固定的,除非手动修改。
因此,top 适合用于查看进程的 实时 CPU 位置,而 taskset 用于查看和修改进程的 可用 CPU 范围。
实验代码
查看 CPU 信息
使用 lscpu 命令查看 CPU 信息。这里主要查看 CPU(s) (CPU 核心数)和 On-line CPU(s) list (在线的 CPU 核心列表),方便后续实验时确认 CPU 核心数和编号,用于使用 taskset 命令绑定进程到指定的 CPU 核心。
查看 CPU 信息
➜ ~ lscpu # 查看 CPU 信息
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 48 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 4 # 这里可以看到有 4 个 CPU 核心
On-line CPU(s) list: 0-3 # 这里可以看到 4 个 CPU 核心的编号
Vendor ID: AuthenticAMD
BIOS Vendor ID: Smdbmds
Model name: AMD EPYC 7K62 48-Core Processor
BIOS Model name: 3.0
CPU family: 23
Model: 49
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Stepping: 0
BogoMIPS: 5190.24
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflus
h mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good n
opl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_
2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy
cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsb
ase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xget
bv1 arat
Virtualization features:
Hypervisor vendor: KVM
Virtualization type: full
Caches (sum of all):
L1d: 128 KiB (4 instances)
L1i: 128 KiB (4 instances)
L2: 16 MiB (4 instances)
L3: 16 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-3
Vulnerabilities:
Gather data sampling: Not affected
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Reg file data sampling: Not affected
Retbleed: Mitigation; untrained return thunk; SMT disabled
Spec rstack overflow: Vulnerable: Safe RET, no microcode
Spec store bypass: Vulnerable
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP disabled; RSB filling; PBRSB-e
IBRS Not affected; BHI Not affected
Srbds: Not affected
Tsx async abort: Not affected安装 stress-ng 压力测试工具
安装 stress-ng 压力测试工具:stress-ng 是一个强大的压力测试工具,可以用来测试系统的稳定性和性能。
安装 stress-ng 压力测试工具
➜ ~ yum search stress # 搜索压力测试工具
==================================== Name & Summary Matched: stress ====================================
stress-ng.x86_64 : Stress test a computer system in various ways
➜ ~ sudo dnf install stress-ng
Dependencies resolved.
========================================================================================================
Package Architecture Version Repository Size
========================================================================================================
Installing:
stress-ng x86_64 0.17.08-2.el9 appstream 2.6 M
Installing dependencies:
Judy x86_64 1.0.5-28.el9 appstream 129 k
lksctp-tools x86_64 1.0.19-2.el9 baseos 94 k
Transaction Summary
========================================================================================================
Install 3 Packages
Total download size: 2.8 M
Installed size: 10 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): Judy-1.0.5-28.el9.x86_64.rpm 629 kB/s | 129 kB 00:00
(2/3): lksctp-tools-1.0.19-2.el9.x86_64.rpm 448 kB/s | 94 kB 00:00
(3/3): stress-ng-0.17.08-2.el9.x86_64.rpm 4.0 MB/s | 2.6 MB 00:00
--------------------------------------------------------------------------------------------------------
Total 4.3 MB/s | 2.8 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : lksctp-tools-1.0.19-2.el9.x86_64 1/3
Installing : Judy-1.0.5-28.el9.x86_64 2/3
Installing : stress-ng-0.17.08-2.el9.x86_64 3/3
Running scriptlet: stress-ng-0.17.08-2.el9.x86_64 3/3
Verifying : Judy-1.0.5-28.el9.x86_64 1/3
Verifying : stress-ng-0.17.08-2.el9.x86_64 2/3
Verifying : lksctp-tools-1.0.19-2.el9.x86_64 3/3
Installed:
Judy-1.0.5-28.el9.x86_64 lksctp-tools-1.0.19-2.el9.x86_64 stress-ng-0.17.08-2.el9.x86_64
Complete!启动压力测试工具
- 使用
stress-ng --cpu 1 &命令启动压力测试工具,--cpu 1表示使用 1 个 CPU 核心,&表示在后台运行。 - 使用
taskset -p 4116040命令查看进程的 CPU 亲和性。
启动压力测试工具
➜ ~ stress-ng --cpu 1 & # 启动压力测试工具 'stress-ng',使用1个CPU模拟负载,并将其放入后台运行
[1] 4116040 # [1] 表示这是后台的第一个任务,4116040 是进程 ID
➜ ~ stress-ng: info: [4116040] defaulting to a 1 day, 0 secs run per stressor
stress-ng: info: [4116040] dispatching hogs: 1 cpu # 'stress-ng' 工具默认运行时间为 1 天,并且分配1个CPU进行压力测试
➜ ~ taskset -p 4116040 # 使用 'taskset' 工具查看进程 ID 为 4116040 的 CPU 亲和性(即在哪些 CPU 核心上运行)
pid 4116040's current affinity mask: f # 输出的 'f'(16进制)表示该进程可以运行在所有的 CPU 核心上(CPU 0, 1, 2, 3)
# f 的二进制为 1111,表示 CPU 0, 1, 2 和 3 都启用
➜ ~ stress-ng --cpu 1 & # 再启动一个 'stress-ng' 进程,同样是使用1个CPU模拟负载,并且放入后台
[2] 4116409 # 这是后台的第二个任务,进程 ID 为 4116409
➜ ~ stress-ng: info: [4116409] defaulting to a 1 day, 0 secs run per stressor
stress-ng: info: [4116409] dispatching hogs: 1 cpu # 新的 'stress-ng' 进程同样会默认运行1天,并分配1个CPU进行测试
➜ ~ taskset -p 4116409 # 查看第二个 'stress-ng' 进程的 CPU 亲和性
pid 4116409's current affinity mask: f # 输出 'f' 表示该进程也可以运行在所有 CPU 核心上(CPU 0, 1, 2, 3)查看系统状态
- 使用
top命令查看系统状态。 - 使用
top命令的P列查看哪个 CPU 核心正在执行压力测试工具。
查看系统状态
➜ ~ top # 查看系统状态
top - 21:20:24 up 65 days, 12:08, 2 users, load average: 2.38, 1.20, 0.52
Tasks: 134 total, 3 running, 131 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.6 sy, 50.1 ni, 48.8 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3658.8 total, 176.9 free, 2652.6 used, 1127.3 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1006.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND P
4116044 root 25 5 37424 8052 3968 R 100.0 0.2 2:00.95 stress-ng-cpu 3
4116413 root 25 5 37424 6840 3840 R 100.0 0.2 1:28.00 stress-ng-cpu 1
3248246 root 20 0 632972 25296 5376 S 1.0 0.7 194:09.38 barad_agent 1
3342034 root 20 0 1047928 130120 32224 S 1.0 3.5 180:47.52 YDService 0
4046878 root 20 0 4740 3200 2944 S 0.3 0.1 0:05.01 zsh 2
1 root 20 0 171912 11392 6912 S 0.0 0.3 7:36.23 systemd 2这里可以看到两个压力测试工具暂时在 CPU 核心 3 和 CPU 核心 1 上运行(P 列显示的值为 3 和 1,top 命令的 P 列显示的是当前正在运行的 CPU 核心,这个值会动态变化)。CPU 使用率达到了 100%。
绑定进程到指定 CPU 核心
- 使用
taskset -p 0x1 4116044命令将进程绑定到 CPU 核心 0。 - 使用
taskset -p 0x1 4116413命令将进程绑定到 CPU 核心 0。
绑定进程到指定 CPU 核心
➜ ~ taskset -p 0x1 4116044 # 使用 'taskset' 将进程 ID 为 4116044 的 CPU 亲和性设置为 0x1(即只允许使用 CPU 0 核心)
pid 4116044's current affinity mask: f # 当前的 CPU 亲和性掩码是 'f',表示进程可以运行在所有 CPU 核心上(CPU 0, 1, 2, 3)
pid 4116044's new affinity mask: 1 # 设置了新的 CPU 亲和性掩码 '1',表示该进程只能在 CPU 0 核心上运行
➜ ~ taskset -p 0x1 4116413 # 同样地,将进程 ID 为 4116413 的 CPU 亲和性也设置为 0x1(只能使用 CPU 0 核心)
pid 4116413's current affinity mask: f # 当前的 CPU 亲和性掩码是 'f',进程可以使用所有 CPU 核心
pid 4116413's new affinity mask: 1 # 设置后的亲和性掩码为 '1',表示进程只能使用 CPU 0再次查看系统状态
再次查看系统状态
➜ ~ top
top - 21:21:28 up 65 days, 12:09, 2 users, load average: 2.44, 1.45, 0.65
Tasks: 134 total, 3 running, 131 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.8 sy, 25.1 ni, 73.4 id, 0.5 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3658.8 total, 175.9 free, 2653.4 used, 1127.4 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1005.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND P
4116044 root 25 5 37424 8052 3968 R 50.3 0.2 2:55.28 stress-ng-cpu 0
4116413 root 25 5 37424 6840 3840 R 50.3 0.2 2:22.32 stress-ng-cpu 0
3248246 root 20 0 632972 25228 5376 S 1.0 0.7 194:10.01 barad_agent 1
3342034 root 20 0 1047928 130120 32224 S 1.0 3.5 180:48.14 YDService 2
3248245 root 20 0 43292 10904 3456 S 0.7 0.3 13:04.60 barad_agent 2
1 root 20 0 171912 11392 6912 S 0.0 0.3 7:36.23 systemd 3这里可以看到两个压力测试工具已经绑定到 CPU 核心 0 上运行(P 列显示的值为 0)。CPU 使用率达到了 50%(两个进程共用一个 CPU 核心)。
结束进程
- 使用
kill 4116044 4116413命令结束两个压力测试工具进程。
结束进程
➜ ~ kill 4116044 4116413 # 使用 'kill' 命令终止进程 ID 为 4116044 和 4116413 的进程
# 进程 4116409 的日志信息
stress-ng: info: [4116409] skipped: 0 # 没有跳过任何测试
stress-ng: info: [4116409] passed: 0 # 没有通过任何测试,任务未完成
stress-ng: info: [4116409] failed: 1: cpu (1) # 1 个 CPU 测试失败,原因是被终止
stress-ng: info: [4116409] metrics untrustworthy: 0 # 度量值没有标记为不可信
stress-ng: info: [4116409] unsuccessful run completed in 3 mins, 41.12 secs # 测试运行了3分41秒,未能成功完成
# 进程 4116040 的日志信息
stress-ng: info: [4116040] skipped: 0 # 没有跳过任何测试
stress-ng: info: [4116040] passed: 0 # 没有通过任何测试,任务未完成
stress-ng: info: [4116040] failed: 1: cpu (1) # 1 个 CPU 测试失败,原因是被终止
stress-ng: info: [4116040] metrics untrustworthy: 0 # 度量值没有标记为不可信
stress-ng: info: [4116040] unsuccessful run completed in 4 mins, 14.06 secs # 测试运行了4分14秒,未能成功完成
[2] + 4116409 exit 2 stress-ng --cpu 1 # 进程 4116409 以退出码 2 结束,表示被终止
[1] + 4116040 exit 2 stress-ng --cpu 1 # 进程 4116040 以退出码 2 结束,表示被终止
# 退出码 2 表示 stress-ng 进程由于异常原因被终止(通常是被 kill 命令杀死)